/*
 * @Author: 别拿暗恋当饭吃. 13466071+lililkli@user.noreply.gitee.com
 * @Date: 2024-07-09 16:11:47
 * @LastEditors: 别拿暗恋当饭吃. 13466071+lililkli@user.noreply.gitee.com
 * @LastEditTime: 2024-07-09 16:11:51
 * @FilePath: \新建文件夹\dome\server.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const WebSocket = require("ws");
const express = require("express");
const cors = require("cors"); // 引入 CORS 中间件

const app = express();

// 设置 CORS 头
app.use(cors());

// 使用 json 中间件解析请求体
app.use(express.json());

// WebSocket 服务器
const wss = new WebSocket.Server({ noServer: true });

// 存储连接的客户端
const clients = [];
// 存储消息历史记录
let messageHistory = [];

// WebSocket 连接处理
wss.on("connection", (ws) => {
  clients.push(ws);
  ws.send("欢迎光临!");

  // 发送历史消息给新连接的客户端
  messageHistory.forEach((message) => {
    ws.send(JSON.stringify(message));
  });

  ws.on("message", (msg) => {
    if (msg instanceof Buffer) {
      msg = msg.toString("utf8");
    }

    const message = {
      timestamp: new Date().toISOString(),
      content: msg,
    };

    // 将消息添加到历史记录
    messageHistory.push(message);

    // 广播消息给所有连接的客户端
    clients.forEach((client) => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify(message));
      }
    });
  });

  ws.on("error", (e) => {
    console.error("WebSocket 发生错误:", e);
  });

  ws.on("close", () => {
    console.log("WebSocket 连接关闭");
    // 从 clients 数组中移除已关闭的客户端连接
    clients.splice(clients.indexOf(ws), 1);
  });
});

// Express 路由，用于获取历史消息
app.get("/history-messages", (req, res) => {
  // 将消息历史记录返回给客户端
  res.json(messageHistory);
});

// 清空历史消息路由
app.delete("/clear-history", (req, res) => {
  // 清空服务器的历史消息记录逻辑
  messageHistory = []; // 假设 messageHistory 是存储消息的数组
  res.status(200).send("History messages cleared");
});

// 处理 Upgrade 请求，将 WebSocket 和 HTTP 服务器结合
const server = app.listen(8080, () => {
  console.log("HTTP 服务器正在监听端口 8080");
});

server.on("upgrade", (request, socket, head) => {
  wss.handleUpgrade(request, socket, head, (ws) => {
    wss.emit("connection", ws, request);
  });
});

// console.log('WebSocket 服务器正在监听端口 8080');
